package com.lwd1513.designPattern.factory.builder;

/**
 * @Author: 刘东（挂兰）
 * @Date: 2023/11/17 22:08:42
 * @Description: 例子建设局建房子
 */
public class HouseDirector {
    public static void main(String[] args) {
        // 创建指挥者
        HouseDirector houseDirector = new HouseDirector();

        houseDirector.setHouseBuilder(new CommonHouseBuilder());
        House build1 = houseDirector.produceHouse();

        houseDirector.setHouseBuilder(new HighHouseBuilder());
        House build2 = houseDirector.produceHouse();
        /**
         * 优点 只要传入对于的builder 可以调用build()方法创建实例
         * 不需要考虑内部的创建过程
         */
    }

    private HouseBuilder houseBuilder;

    /**
     * 指挥者 通过传入蓝图的实现 产生房子
     */
    public void setHouseBuilder(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    public House produceHouse() {
        houseBuilder.step1();
        houseBuilder.step2();
        houseBuilder.step3();
        return houseBuilder.build();
    }
}

/**
 * 普通的房子
 */
class CommonHouseBuilder extends HouseBuilder {
    @Override
    void step1() {
        System.out.println("CommonHouseBuilder 1");
    }

    @Override
    void step2() {
        System.out.println("CommonHouseBuilder 2");
    }

    @Override
    void step3() {
        System.out.println("CommonHouseBuilder 3");
    }
}

/**
 * 高楼
 */
class HighHouseBuilder extends HouseBuilder {
    @Override
    void step1() {
        System.out.println("HighHouseBuilder 1");
    }

    @Override
    void step2() {
        System.out.println("HighHouseBuilder 2");
    }

    @Override
    void step3() {
        System.out.println("HighHouseBuilder 3");
    }
}

/**
 * 最终要建造出来的房子
 */
class House {
    // ... 一些属性
    private Integer height;
    private Integer width;
}

/**
 * 抽象的建造者 --一系列蓝图
 */
abstract class HouseBuilder {

    private House house = new House();

    /**
     * 一系列步骤填充房子的信息
     */
    abstract void step1();

    abstract void step2();

    abstract void step3();

    protected House build() {
        return house;
    }

}


